
/*
 * Copyright (C) Zhu Jiashun
 * Copyright (C) Zaver
 */

#ifndef DBG_H
#define DBG_H

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#ifdef NDEBUG // 是否定义了 NODEBUG
#define debug(M, ...)
#else
#define debug(M, ...) fprintf(stderr, "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
#endif

#define clean_errno() (errno == 0 ? "None" : strerror(errno)) // 将 errno 转化为 string

#define log_err(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)

#define log_warn(M, ...) fprintf(stderr, "[WARN] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)

#define log_info(M, ...) fprintf(stderr, "[INFO] (%s:%d) " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)

// 检查 A，不符合输出日志
#define check(A, M, ...)                               \
    if (!(A))                                          \
    {                                                  \
        log_err(M "\n", ##__VA_ARGS__); /* exit(1); */ \
    }

// 检查 A，不符合输出日志并退出程序
#define check_exit(A, M, ...)           \
    if (!(A))                           \
    {                                   \
        log_err(M "\n", ##__VA_ARGS__); \
        exit(1);                        \
    }

// 检查 A，不符合输出 debug 信息，不包含 errno 信息
#define check_debug(A, M, ...)                       \
    if (!(A))                                        \
    {                                                \
        debug(M "\n", ##__VA_ARGS__); /* exit(1); */ \
    }

#endif
